package com.yunchao.feature.base.domain.utils

import android.graphics.Color
import androidx.annotation.ColorRes
import com.github.mikephil.charting.animation.Easing
import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.components.AxisBase
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.ValueFormatter
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet
import kotlin.math.abs


object MPChartUtils {

    /**
     * 不显示无数据的提示
     *
     * @param mChart
     */
    fun notShowNoDataText(mChart: BarChart) {
        mChart.clear()
        mChart.notifyDataSetChanged()
        mChart.setNoDataText("你还没有记录数据")
        mChart.setNoDataTextColor(Color.WHITE)
        mChart.invalidate()
    }


    /**
     * 初始化BarChart图表
     */
    fun initBarChart(barChart: BarChart) {
        /***图表设置***/
        // 背景颜色
        barChart.setBackgroundColor(Color.WHITE)
        // 不显示图表网格
        barChart.setDrawGridBackground(false)
        // 背景阴影
        barChart.setDrawBarShadow(false)
        barChart.isHighlightFullBarEnabled = false
        // 显示边框
        barChart.setDrawBorders(true)

        // 不显示图表边框
        barChart.setDrawBorders(false)
        // 不显示右下角描述内容
        val description = Description()
        description.isEnabled = false
        barChart.description = description
        // 设置动画效果
        barChart.animateY(1000, Easing.Linear)
        barChart.animateX(1000, Easing.Linear)

        /***XY轴的设置***/
        // X轴设置显示位置在底部
        val xAxis = barChart.xAxis
        xAxis?.position = XAxis.XAxisPosition.BOTTOM
        xAxis?.labelRotationAngle = 45f
        //
        xAxis?.axisMinimum = 0f
        xAxis?.granularity = 1f

        val leftAxis = barChart.axisLeft
        val rightAxis = barChart.axisRight
        // 保证Y轴从0开始，不然会上移一点
//        leftAxis?.axisMinimum = 0f
//        rightAxis?.axisMinimum = 0f

        // 不显示X轴网格线
        xAxis?.setDrawGridLines(false)
        // 右侧Y轴网格线设置为虚线
        rightAxis?.enableGridDashedLine(10f, 10f, 0f)
        // 左边y轴不显示
        leftAxis?.isEnabled = false

        // 不显示X轴 Y轴线条
        xAxis?.setDrawAxisLine(false)
        leftAxis?.setDrawAxisLine(false)
        rightAxis?.setDrawAxisLine(false)

        /***折线图例 标签 设置***/
        val legend = barChart.legend
        legend?.form = Legend.LegendForm.LINE
        // 显示位置
        legend?.verticalAlignment = Legend.LegendVerticalAlignment.TOP
        legend?.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER
        legend?.orientation = Legend.LegendOrientation.HORIZONTAL
        // 是否绘制在图表里面
        legend.setDrawInside(true)
    }


    /**
     * @param xValues   X轴的值
     * @param dataLists LinkedHashMap<String, List<Float>>
     *                  key对应柱状图名字  List<Float> 对应每类柱状图的Y值
     * @param colors
     */
    fun showBarChart(
        barChart: BarChart,
        xValues: List<String>,
        dataLists: Map<String, List<Float>>,
        @ColorRes colors: List<Int>
    ) {
        val dataSets = ArrayList<IBarDataSet>()
        var currentPosition = 0// 用于柱状图颜色集合的index

        for ((name, yValueList) in dataLists) {
            val entries = ArrayList<BarEntry>()

            for (i in yValueList.indices) {
                entries.add(BarEntry(i.toFloat(), yValueList[i]))
            }
            // 每一个BarDataSet代表一类柱状图
            val barDataSet = BarDataSet(entries, name)
            initBarDataSet(barDataSet, colors[currentPosition])
            dataSets.add(barDataSet)

            currentPosition++
        }

        // X轴自定义值
        barChart.xAxis?.valueFormatter = object : ValueFormatter() {
            override fun getAxisLabel(value: Float, axis: AxisBase): String {
                return xValues[abs(value.toInt()) % xValues.size]
            }
        }
        // 右侧Y轴自定义值
        barChart.axisRight?.valueFormatter = object : ValueFormatter() {
            override fun getAxisLabel(value: Float, axis: AxisBase): String {
                return "${value.toInt()}"
            }
        }
        /**
         * 默认多条柱状显示是堆积柱状图
         */
        // 不加上会x轴显示不全
        barChart.xAxis?.axisMaximum = xValues.size.toFloat()
        // 将X轴的值显示在中央
        barChart.xAxis.setCenterAxisLabels(true)

        val data = BarData(dataSets)

        /**
         * 并排多列柱状图
         * float groupSpace = 0.3f;   // 柱状图组之间的间距
         * float barSpace =  0.05f;  // 每条柱状图之间的间距  一组两个柱状图
         * float barWidth = 0.3f;    // 每条柱状图的宽度     一组两个柱状图
         * (barWidth + barSpace) * barAmount + groupSpace = (0.3 + 0.05) * 2 + 0.3 = 1.00
         * 3个数值 加起来 必须等于 1 即100% 按照百分比来计算 组间距 柱状图间距 柱状图宽度
         */
        val barAmount = dataLists.size // 需要显示柱状图的类别 数量
        // 设置组间距占比30% 每条柱状图宽度占比 70% /barAmount  柱状图间距占比 0%
        val groupSpace = 0.3f // 柱状图组之间的间距
        val barWidth = (1f - groupSpace) / barAmount
        val barSpace = 0f
        // 设置柱状图宽度
        data.barWidth = barWidth
        // (起始点、柱状图组间距、柱状图之间间距)
        data.groupBars(0f, groupSpace, barSpace)
        barChart.data = data
    }


    /**
     * 柱状图始化设置 一个BarDataSet 代表一列柱状图
     *
     * @param barDataSet 柱状图
     * @param color      柱状图颜色
     */
    private fun initBarDataSet(barDataSet: BarDataSet, color: Int) {
        barDataSet.color = color
        barDataSet.formLineWidth = 1f
        barDataSet.formSize = 15f
        // 不显示柱状图顶部值
        barDataSet.setDrawValues(true)
        barDataSet.valueTextSize = 10f
        barDataSet.valueTextColor = color
    }
}

